#pragma once

#include <sstream>
#include <stdexcept>

namespace mysql {

    class SQLException : public std::runtime_error {

    public:

        /**
          * @brief  构造一个SQLException异常
          * @note   what方法的字符串根据buildErrorMessage进行构造
          * @param  message    错误信息
          * @param  error_code 错误代码
          * @param  sql_state  SQL错误状态
          */
        SQLException(const std::string &message, unsigned int error_code, const std::string &sql_state = "") :
                std::runtime_error(buildErrorMessage(message, error_code, sql_state)),
                error_code_(error_code),
                sql_state_(sql_state) {}

        // 获取错误代码
        unsigned int getErrorCode() const { return error_code_; }

        // 获取 SQL 状态码
        std::string getSqlState() const { return sql_state_; }

    private:

        // 将错误信息构建为一个提示字符串作为runtime_error的构造参数
        static std::string
        buildErrorMessage(const std::string &message, unsigned int error_code, const std::string &sql_state);

        // 错误代码
        unsigned int error_code_;

        // SQL状态码
        std::string sql_state_;

    };

}
